package leetcode.interviewClassics;

/**
 * @author Cheng Jun
 * Description: 给你 n 个非负整数 a1，a2，...，an，每个数代表坐标中的一个点  (i,  ai) 。
 * 在坐标内画 n 条垂直线，垂直线 i  的两个端点分别为  (i,  ai) 和 (i, 0) 。
 * 找出其中的两条线，使得它们与  x  轴共同构成的容器可以容纳最多的水。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/container-with-most-water
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @version 1.0
 * @date 2021/11/10 13:09
 * 字节面试题
 */
public class maxArea {

    public static void main(String[] args) {
    maxArea(new int[] {1, 2, 3});
    }

    // 贪心算法：时间复杂度 O(n^2)
    static int maxArea(int[] height) {
        // 特殊情况——不能构成一个区域
        if (height.length < 2) {
            return 0;
        }
        int maxArea = 0;
        int shorter = 0;
        for (int i = 0; i < height.length - 1; i++) {
            // 当边界 变小时，这个边界计算出面积，肯定没有之前的计算结果大
            if (shorter < height[i]) {
                shorter = height[i];
            } else {
                continue;
            }
            for (int j = i + 1; j < height.length; j++) {
                int indexMaxArea = Math.min(shorter, height[j]) * (j - i);
                maxArea = Math.max(maxArea, indexMaxArea);
            }
        }
        return maxArea;
    }

    // 双指针法：双指针指向头尾，然后把较小值的指针向中间移动，直到 头指针的下标等于尾指针的下标。
    // 时间复杂度：O(n)
    static int maxArea1(int[] height) {
        int maxArea = 0;
        int head = 0;
        int tail = height.length - 1;
        while (head < tail) {
            if (height[head] < height[tail]) {
                maxArea = Math.max(maxArea, height[head] * (tail - head));
                head++;
            } else {
                maxArea = Math.max(maxArea, height[tail] * (tail - head));
                tail--;
            }
        }
        return maxArea;
    }
}
